package br.com.cinesystem.control;

import br.com.cinesystem.entity.Cinema;
import br.com.cinesystem.entity.Filme;
import br.com.cinesystem.entity.Sala;
import br.com.cinesystem.entity.Sessao;
import br.com.cinesystem.entity.Usuario;
import br.com.cinesystem.persistence.CinemaDao;
import br.com.cinesystem.persistence.FilmeDao;
import br.com.cinesystem.persistence.SalaDao;
import br.com.cinesystem.persistence.SessaoDao;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ManterSessao extends HttpServlet {
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String cmd = request.getParameter("cmd");

        if (cmd != null){

            if (cmd.equals("cadastrar")){

                SessaoDao sd = null;
                FilmeDao fd = null;

                String destino = "sessao.do?cmd=listar";

                try{

                    sd = new SessaoDao();

                    if(request.getParameter("sala").isEmpty()){

                        destino = "sessao.do?cmd=form";
                        throw new Exception("*Sala é um campo obrigatório!");

                    }else{

                        if(request.getParameter("filme").isEmpty()){

                            destino = "sessao.do?cmd=form";
                            throw new Exception("*Filme é um campo obrigatório!");

                        }else{

                            if(request.getParameter("data").isEmpty()){

                                destino = "sessao.do?cmd=form";
                                throw new Exception("*Data é um campo obrigatório!");

                            }else{

                                if(request.getParameter("hora").isEmpty()){

                                    destino = "sessao.do?cmd=form";
                                    throw new Exception("*Hora é um campo obrigatório!");

                                }else{

                                    if(request.getParameter("preco").isEmpty()){

                                        destino = "sessao.do?cmd=form";
                                        throw new Exception("*Preço é um campo obrigatório!");

                                    }else{
                                        
                                        Sessao s = new Sessao();

                                        s.setSala(new Sala());
                                        s.setFilme(new Filme());

                                        String data =  request.getParameter("data");
                                        String hora = request.getParameter("hora");

                                        String vetor2[] = hora.split(":");

                                        if(Integer.parseInt(vetor2[0])>23){

                                            destino = "sessao.do?cmd=form";
                                            throw new Exception("*Hora não pode ser superior que 23:59!");

                                        }else{

                                            if(Integer.parseInt(vetor2[1])>59){

                                                destino = "sessao.do?cmd=form";
                                                throw new Exception("*Hora nao esta no formato correto (ex. 23:59 ou 00:00)!");

                                            }else{

                                                String vetor[] = data.split("/");
                                                Date dataSessao = new Date(vetor[1]+"/"+vetor[0]+"/"+vetor[2]);

                                                Date horaSessao = new Date(vetor[1]+"/"+vetor[0]+"/"+vetor[2]+" "+request.getParameter("hora")+":00");

                                                DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance();

                                                Double d = null;

                                                try{

                                                    d = df.parse(request.getParameter("preco")).doubleValue();

                                                }catch (Exception ee){

                                                    destino = "sessao.do?cmd=form";
                                                    throw new Exception("*Digite o preço no formato correto (ex. 06,50 ou 12,00)!");

                                                }
                                                
                                                s.getSala().setIdSala(Integer.parseInt(request.getParameter("sala")));
                                                s.getFilme().setIdFilme(Integer.parseInt(request.getParameter("filme")));
                                                s.setData(dataSessao);
                                                s.setHora(horaSessao);
                                                s.setPreco(d);
                                                s.setDetalhes(request.getParameter("detalhes"));
                                                
                                                fd = new FilmeDao();

                                                Filme filme = fd.buscar(s.getFilme());

                                                Calendar termino = Calendar.getInstance();
                                                Calendar inicio = Calendar.getInstance();
                                                inicio.setTime(horaSessao);
                                                termino.setTime(horaSessao);

                                                termino.add(Calendar.MINUTE, filme.getDuracao());
                                                
                                                List<Sessao> listaDia = sd.buscarPorData(s);
                                                
                                                
                                                if(!listaDia.isEmpty()){
                                                
                                                    for (Sessao ses : listaDia){
                                                        

                                                        Calendar SessaoIni = Calendar.getInstance();
                                                        Calendar SessaoFim = Calendar.getInstance();
                                                        
                                                        SessaoIni.setTime(ses.getHora());
                                                        SessaoFim.setTime(ses.getHora());
                                                        
                                                        SessaoFim.add(Calendar.MINUTE, ses.getFilme().getDuracao());
                                                        

                                                        if(inicio.after(SessaoIni) && inicio.before(SessaoFim)){

                                                            destino = "sessao.do?cmd=form";
                                                            throw new Exception("*Já existe uma sessão em apresentação neste mesmo horário!");

                                                        }else if(inicio.before(SessaoIni) && termino.after(SessaoFim)){

                                                            destino = "sessao.do?cmd=form";
                                                            throw new Exception("*Já existe uma sessão em apresentação neste mesmo horário!");

                                                        }else if(inicio.before(SessaoIni) && termino.after(SessaoIni)){

                                                            destino = "sessao.do?cmd=form";
                                                            throw new Exception("*Já existe uma sessão em apresentação neste mesmo horário!");

                                                        }
                                                    }
                                                }
                                                
                                                sd.salvar(s);
                                                destino = "sessao.do?cmd=listar";
                                                request.setAttribute("mensagem", "*Sessão cadastrada com sucesso.");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                }catch (Exception exc){

                    request.setAttribute("mensagem", exc.getMessage());

                }finally{

                    request.getRequestDispatcher(destino).forward(request, response);
                }

            }

            if (cmd.equals("alterar")){

                SessaoDao sd = null;
                FilmeDao fd = null;

                String destino = "sessao.do?cmd=buscar&id="+request.getParameter("id");

                try{

                    sd = new SessaoDao();

                    if(request.getParameter("sala").isEmpty()){

                        throw new Exception("*Sala é um campo obrigatório!");

                    }else{

                        if(request.getParameter("filme").isEmpty()){

                            throw new Exception("*Filme é um campo obrigatório!");

                        }else{

                            if(request.getParameter("data").isEmpty()){

                                throw new Exception("*Data é um campo obrigatório!");

                            }else{

                                if(request.getParameter("hora").isEmpty()){

                                    throw new Exception("*Hora é um campo obrigatório!");

                                }else{

                                    if(request.getParameter("preco").isEmpty()){

                                        throw new Exception("*Preço é um campo obrigatório!");

                                    }else{

                                        Sessao s = new Sessao();

                                        s.setSala(new Sala());
                                        s.setFilme(new Filme());

                                        String data =  request.getParameter("data");
                                        String hora = request.getParameter("hora");

                                        String vetor2[] = hora.split(":");

                                        if(Integer.parseInt(vetor2[0])>23){

                                            destino = "sessao.do?cmd=buscar&id="+request.getParameter("id");
                                            throw new Exception("*Hora não pode ser superior que 23:59!");

                                        }else{

                                            if(Integer.parseInt(vetor2[1])>59){

                                                destino = "sessao.do?cmd=buscar&id="+request.getParameter("id");
                                                throw new Exception("*Hora nao esta no formato correto (ex. 23:59 ou 00:00)!");

                                            }else{

                                                String vetor[] = data.split("/");
                                                Date dataSessao = new Date(vetor[1]+"/"+vetor[0]+"/"+vetor[2]);

                                                Date horaSessao = new Date(vetor[1]+"/"+vetor[0]+"/"+vetor[2]+" "+request.getParameter("hora")+":00");

                                                DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance();

                                                Double d = null;

                                                try{

                                                    d = df.parse(request.getParameter("preco")).doubleValue();

                                                }catch (Exception ee){

                                                    destino = "sessao.do?cmd=buscar&id="+request.getParameter("id");
                                                    throw new Exception("*Digite o preço no formato correto (ex. 06,50 ou 12,00)!");

                                                }

                                                s.getSala().setIdSala(Integer.parseInt(request.getParameter("sala")));
                                                s.getFilme().setIdFilme(Integer.parseInt(request.getParameter("filme")));
                                                s.setData(dataSessao);
                                                s.setHora(horaSessao);
                                                s.setPreco(d);
                                                s.setDetalhes(request.getParameter("detalhes"));
                                                s.setIdSessao(Integer.parseInt(request.getParameter("id")));

                                                fd = new FilmeDao();

                                                Filme filme = fd.buscar(s.getFilme());

                                                Calendar termino = Calendar.getInstance();
                                                Calendar inicio = Calendar.getInstance();
                                                inicio.setTime(horaSessao);
                                                termino.setTime(horaSessao);

                                                termino.add(Calendar.MINUTE, filme.getDuracao());

                                                List<Sessao> listaDia = sd.buscarPorData(s);


                                                if(!listaDia.isEmpty()){

                                                    for (Sessao ses : listaDia){


                                                        Calendar SessaoIni = Calendar.getInstance();
                                                        Calendar SessaoFim = Calendar.getInstance();

                                                        SessaoIni.setTime(ses.getHora());
                                                        SessaoFim.setTime(ses.getHora());

                                                        SessaoFim.add(Calendar.MINUTE, ses.getFilme().getDuracao());


                                                        if(inicio.after(SessaoIni) && inicio.before(SessaoFim)){

                                                            destino = "sessao.do?cmd=buscar&id="+request.getParameter("id");
                                                            throw new Exception("*Já existe uma sessão em apresentação neste mesmo horário!");

                                                        }else if(inicio.before(SessaoIni) && termino.after(SessaoFim)){

                                                            destino = "sessao.do?cmd=buscar&id="+request.getParameter("id");
                                                            throw new Exception("*Já existe uma sessão em apresentação neste mesmo horário!");

                                                        }else if(inicio.before(SessaoIni) && termino.after(SessaoIni)){

                                                            destino = "sessao.do?cmd=buscar&id="+request.getParameter("id");
                                                            throw new Exception("*Já existe uma sessão em apresentação neste mesmo horário!");

                                                        }
                                                    }
                                                }

                                                sd.alterar(s);
                                                destino = "sessao.do?cmd=listar";
                                                request.setAttribute("mensagem", "*Sessão alterada com sucesso.");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                }catch (Exception exc){

                    request.setAttribute("mensagem", exc.getMessage());

                }finally{

                    request.getRequestDispatcher(destino).forward(request, response);
                }

            }

            if(cmd.equals("verSessoes")){

                    SessaoDao sd = new SessaoDao();

                    String destino = "filme.do?cmd=home";

                    try{

                        HttpSession session = request.getSession(true);

                        Filme filme = new Filme();

                        filme.setIdFilme(Integer.parseInt(request.getParameter("idf")));
                        filme.setCinemaList(new ArrayList<Cinema>());
                        filme.getCinemaList().add(new Cinema(Integer.parseInt(request.getParameter("idc"))));

                        Usuario u = (Usuario) request.getSession().getAttribute("sessao");

                        request.setAttribute("sessoes", sd.buscarCinemasFilmes(filme));
                        request.setAttribute("filme", request.getParameter("idf"));
                        if(u!=null){
                            if(u.getPerfil()==1){
                                destino = "cliente/sessoes_cinemas.jsp";
                            }else if(u.getPerfil()==2){
                                destino = "funcionario/sessoes_cinemas.jsp";
                            }else if(u.getPerfil()==3){
                                destino = "admin/sessoes_cinemas.jsp";
                            }

                        }else{

                            destino = "sessoes_cinemas.jsp";

                        }

                    }catch (Exception exc){

                        request.setAttribute("mensagem", exc.getMessage());

                    }finally{

                        request.getRequestDispatcher(destino).forward(request, response);

                    }

            }

            if(cmd.equals("form")){

                FilmeDao fd = null;
                SalaDao sd = null;
                String destino = "sessao.do?cmd=listar";

                HttpSession session = request.getSession(true);

                Usuario us = (Usuario) request.getSession().getAttribute("sessao");

                if(us!=null){

                    if(us.getPerfil().equals(1)){
                        destino = "filme.do?cmd=home";
                    }
                    if(us.getPerfil().equals(2)){
                        destino = "funcionario/cadastro_sessao.jsp";
                    }
                    if(us.getPerfil().equals(3)){
                        destino = "admin/cadastro_sessao.jsp";
                    }

                }

                try{

                    fd = new FilmeDao();
                    sd = new SalaDao();

                    if(us!=null){

                        List<Filme> listaf = fd.buscarTodos();

                        List<Sala> listas = sd.buscarTodos();

                        request.setAttribute("filmes", listaf);
                        request.setAttribute("salas", listas);

                    }else{

                        throw new Exception("*Você deve estar logado e ter permissão para realizar esta operação!");

                    }

                }catch (Exception exc){

                    request.setAttribute("mensagem", exc.getMessage());

                }finally{

                    request.getRequestDispatcher(destino).forward(request, response);

                }

            }

            if(cmd.equals("buscar")){

                FilmeDao fd = null;
                SalaDao sd = null;
                SessaoDao sesd = null;
                String destino = "sessao.do?cmd=listar";
                HttpSession session = request.getSession(true);

                Usuario us = (Usuario) request.getSession().getAttribute("sessao");

                if(us!=null){

                    if(us.getPerfil().equals(1)){
                        destino = "filme.do?cmd=home";
                    }
                    if(us.getPerfil().equals(2)){
                        destino = "funcionario/alterar_sala.jsp";
                    }
                    if(us.getPerfil().equals(3)){
                        destino = "admin/alterar_sessao.jsp";
                    }

                }
                try{

                    fd = new FilmeDao();
                    sd = new SalaDao();
                    sesd = new SessaoDao();

                    if(us!=null){

                        List<Filme> listaf = fd.buscarTodos();

                        List<Sala> listas = sd.buscarTodos();

                        Sessao ses = new Sessao();
                        ses.setIdSessao(Integer.parseInt(request.getParameter("id")));

                        ses = sesd.buscar(ses);

                        request.setAttribute("ses", ses);
                        request.setAttribute("filmes", listaf);
                        request.setAttribute("salas", listas);

                    }else{

                        throw new Exception("*Você deve ser cadastrado e estar logado!");

                    }

                }catch (Exception exc){

                    request.setAttribute("mensagem", exc.getMessage());

                }finally{

                    request.getRequestDispatcher(destino).forward(request, response);

                }

            }

            if (cmd.equals("listar")){

                SessaoDao sd = null;
                String destino = "filme.do?cmd=home";
                HttpSession session = request.getSession(true);

                Usuario us = (Usuario) request.getSession().getAttribute("sessao");

                if(us!=null){

                    if(us.getPerfil().equals(1)){
                        destino = "filme.do?cmd=home";
                    }
                    if(us.getPerfil().equals(2)){
                        destino = "funcionario/sessao.jsp";
                    }
                    if(us.getPerfil().equals(3)){
                        destino = "admin/sessao.jsp";
                    }

                }
                try{

                    sd = new SessaoDao();

                    List<Sessao> lista = sd.buscarTodos();

                    request.setAttribute("sessoes", lista);

                }catch (Exception exc){

                    request.setAttribute("mensagem", exc.getMessage());

                }finally{

                    request.getRequestDispatcher(destino).forward(request, response);

                }

            }

            if (cmd.equals("excluir")){

                SessaoDao sd = null;

                String destino = "sessao.do?cmd=listar";
                HttpSession session = request.getSession(true);

                Usuario us = (Usuario) request.getSession().getAttribute("sessao");

                if(us!=null){

                    if(us.getPerfil().equals(1)){
                        destino = "filme.do?cmd=home";
                    }
                    if(us.getPerfil().equals(2)){
                        destino = "sessao.do?cmd=listar";
                    }
                    if(us.getPerfil().equals(3)){
                        destino = "sessao.do?cmd=listar";
                    }

                }

                try{

                    sd = new SessaoDao();

                    Sessao s = new Sessao();

                    s.setIdSessao(Integer.parseInt(request.getParameter("id")));

                    sd.excluir(s);

                    request.setAttribute("mensagem", "*Sessão desativado com sucesso.");

                }catch (Exception exc){

                    request.setAttribute("mensagem", exc.getMessage());

                }finally{

                    request.getRequestDispatcher(destino).forward(request, response);

                }

            }

        }
    } 

    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}
